//import "java.awt.*"; import "javax.swing.*";  
//import "java.awt.event.*"; import "java.awt.geom.*";
//import "java.awt.image.*";
//
///*
//  MeleeSequencePanel.java
//    (c)1999-2004 SSC Development Team
//  Functions: 
//  -Running Battle Animations.
//  Allowed Dependencies: Buffer.java, Entity.java
//*/
//
//@implementation 
//MeleeSequencePanel JPanel implements ActionListener
//{
//  Entity a; //Attacking entity
//  Entity d; //Defending entity
//  Image bg;
//  Image[] att_frames;
//  Image def_frame;
//  
//  int frame = 0; //Current frame
//  
//  int maxframe = 3; //Starts out at 3 for normal sequences
//  /* Idea: increase maxframe for counterattacks and the like! 
//   * Or: Switch the entities and start out at frame 0 again O_O. 
//   */
//  
//  Timer timer = new Timer(Buffer.TimerDelay, this); //Timer delay.TWEAKABLE
//  
//  char checkHit;
//  int damage = 0;
//  int expGained = 0;
//  int levelGained = 0;
//  int oldmaxhp = 0;
//  int oldavdam = 0;
//  
//  /* Constructor for default attack */
//  public MeleeSequencePanel(Entity a, Entity d) 
//  {
//    super(true);
//    
//    bg = Lib_Image.getImage(Stats.getTileBattleBackground(d.x/24, d.y/24));
//    att_frames = new Image[a.img_attack.length];
//    for(int i = 0; i < a.img_attack.length; i++) {
//      att_frames[i] = a.img_attack[i];
//    }
//    
//    /* Load & Mirror Defender frame */
//    def_frame = d.img_attack[0];
//    // Dirty !
//    while(def_frame.getWidth(null) < 0) {    }
//    
//    AffineTransform tx = AffineTransform.getScaleInstance(-1.0, 1.0); 
//    tx.translate(-def_frame.getWidth(null), 0);
//    AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
//    
//    def_frame = op.filter(Lib_Image.toBufferedImage(def_frame), null);
//    
//    
//    this.a = a;
//    this.d = d;
//    frame = 0;
//    checkHit = Stats.checkHit(a,d);
//    damage = Stats.genDmg(a,d);
//    startAnimation();  
//  }
//  
//  public boolean Update() {   
//    boolean running = true; 
//    
//    frame++;    
//    this.paint(this.getGraphics()); 
//    
//    if(frame == 1) {
//      if(checkHit == 'h' || checkHit == 'b') {
//        d.curhp -= damage;
//        if(d.curhp < 1) { //Opponent dies? Then we have a KILL!
//          checkHit = 'k';
//        }
//      }
//    }
//    
//    if(frame == 2 && a.classname != null) {
//      expGained = Stats.calcExp(d,damage,checkHit);
//      a.exp += expGained;
//    }
//    
//    if(frame == 3) {
//      if(Stats.checkLevelUp(a)) {
//        levelGained = 1;
//        oldmaxhp = a.maxhp;
//        oldavdam = a.mindam + (a.damran/2);
//        //a.exp -= Stats.calcExp(a);
//        Stats.levelupEntity(a);
//      }
//    }  
//    
//    this.paint(this.getGraphics());    
//        
//    if(frame > 2) {
//      stopAnimation();
//      running = false;
//      bg = null;
//      att_frames = null;
//      def_frame = null;
//    }  
//    return(running);
//  }
//  
//  public boolean Force() { //Force animation updates by pressing 's' or 'd' key!
//    if(frame > 2) { return(false); }
//    if(frame > 1) { Update(); }
//       
//    return(true);
//  }
//  
// 
//-(void) paintComponent(Graphics g) {
//    ((Graphics2D) g).scale(Buffer.ScaleRatio,Buffer.ScaleRatio);
//    
//    g.setColor(new Color(0,0,0));
//    
//    g.fill3DRect(0,0,360,240,true);
//    
//    g.drawImage(bg,0,40,this);
//    
//    g.drawImage(def_frame,5,170-def_frame.getHeight(this),this);
//    
//    //frame mapping for 2-frame animations
//    int[] framemap = {0,1,2%att_frames.length,0,0};    
//    int curfr = framemap[frame];
//    
//    g.drawImage(att_frames[curfr],355-att_frames[curfr].getWidth(this),185-att_frames[curfr].getHeight(this),this);
//    //g.drawImage(def_frame,350-def_frame.getWidth(this),40,this);
//    
//    Lib_Image.targetStatBox(g, d);
//    Lib_Image.playerStatBox(g);
//    
//    if(frame == 0) {
//      Lib_Image.battleBox(g,a.name+" attacks...","","");
//    }
//    else if(frame == 1) {
//      if(checkHit == 'h') {
//        Lib_Image.battleBox(g,a.name+" attacks...","...and inflicts "+damage+" damage!","");
//      }  
//      else if(checkHit == 'b') {
//        Lib_Image.battleBox(g,a.name+" attacks...from the back!","...and inflicts "+damage+" damage!","");
//      }
//      else if(checkHit == 'm') {
//        Lib_Image.battleBox(g,a.name+" attacks...","...but misses the opponent.","");
//      }
//      else if(checkHit == 'd') {
//        Lib_Image.battleBox(g,a.name+" attacks...","...but "+d.name+" dodges the attack!","");
//      }
//      else if(checkHit == 'k') {
//        Lib_Image.battleBox(g,a.name+" attacks...","...and inflicts "+damage+" damage!",d.name+" dies in honor...");
//      }
//    }  
//    else if(frame == 2) {
//      Lib_Image.battleBox(g,a.name+" gains "+expGained+" exp.","","");
//    }  
//    else if(frame == 3) {
//      if(levelGained == 0) {
//        Lib_Image.battleBox(g,a.name+" gains no level.","","");
//      }  
//      else {
//        Lib_Image.battleBox(g,a.name+" becomes level "+a.level+".",
//                            "Max HP increases by "+(a.maxhp-oldmaxhp),
//                            "Average Damage increases by "+(a.mindam+(a.damran/2)-oldavdam));
//      }
//    }
//    
//  }    
//  
//  public synchronized void startAnimation() {
//    timer.start();
//  }
//
//  public synchronized void stopAnimation() {
//    timer.stop();
//  }
//  
//  private int anim_delay = Buffer.AnimDelay*4; //Animation delay per frame. TWEAKABLE
//  private int anim_iterator = 0;
//
// -(void) actionPerformed(ActionEvent e) {     
//    //tile & sprite animation
//    anim_iterator++;
//    if(anim_iterator>=anim_delay) {
//      anim_iterator = 0;
//      Update();      
//    }
//  }
//}  